"""
用户管理模块
包含用户登录、注册、微信绑定、密码管理等功能
"""

from django.http import JsonResponse
from rest_framework.views import APIView
from django.core import serializers
from datetime import datetime, timedelta
import time

# 导入模型
from WxApi import models
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator


class wx_loginwx(APIView):
    """用户登录接口"""
    def post(self, request, *args, **kwargs):
        username = request.data.get('username')
        password = request.data.get('password')
        print(username, password)

        try:
            user_obj = models.User.objects.select_related('Per_group', 'part_id').filter(
                zh_name=username.strip(), 
                zh_pwd=password.strip()
            ).first()
            
            if user_obj:
                # 返回统一的用户信息结构（与微信登录保持一致）
                user_info = {
                    'id': user_obj.id,
                    'zh_name': user_obj.zh_name,
                    'zh_pwd': user_obj.zh_pwd,
                    'open_id': user_obj.open_id,
                    'wx_avatar_url': user_obj.wx_avatar_url,
                    'per_team': user_obj.per_team,
                    'create_time': user_obj.create_time.isoformat() if user_obj.create_time else None,
                    'update_time': user_obj.update_time.isoformat() if user_obj.update_time else None,
                    'is_active': user_obj.is_active,
                    # 统一使用 _id 后缀的字段名
                    'Per_group_id': user_obj.Per_group.permit,
                    'part_id_id': user_obj.part_id.departm,
                    # 同时保留对象访问方式（兼容性）
                    'Per_group': user_obj.Per_group.permit,
                    'part_id': user_obj.part_id.departm,
                }
                
                return JsonResponse({
                    'status': True,
                    'user_info': user_info,
                    'permission_level': user_obj.Per_group.permit,
                    'permission_name': user_obj.Per_group.get_permit_display(),
                    'department': user_obj.part_id.get_departm_display(),
                })
            else:
                return JsonResponse({
                    'status': False,
                    'message': '用户名或密码错误'
                })
                
        except Exception as e:
            print(f"登录错误: {str(e)}")
            return JsonResponse({
                'status': False,
                'message': '登录失败，请稍后重试'
            })

class wx_GetUserByOpenId(APIView):
    """根据OpenId获取用户信息"""
    def get(self, request, *args, **kwargs):
        try:
            openid = request.GET.get('openid')
            
            start_time = time.time()
            # 查询用户记录，使用select_related优化查询
            users = models.User.objects.select_related('Per_group', 'part_id').filter(open_id=openid)
            
            user_list = []
            for user in users:
                user_data = {
                    'id': user.id,
                    'zh_name': user.zh_name,
                    'zh_pwd': user.zh_pwd,
                    'open_id': user.open_id,
                    'wx_avatar_url': user.wx_avatar_url,
                    'per_team': user.per_team,
                    'create_time': user.create_time.isoformat() if user.create_time else None,
                    'update_time': user.update_time.isoformat() if user.update_time else None,
                    'is_active': user.is_active,
                    # 统一使用 _id 后缀的字段名（与密码登录保持一致）
                    'Per_group_id': user.Per_group.permit,
                    'part_id_id': user.part_id.departm,
                    # 同时保留对象访问方式（兼容性）
                    'Per_group': user.Per_group.permit,
                    'part_id': user.part_id.departm,
                }
                user_list.append(user_data)
            
            query_duration = time.time() - start_time
            print(f"微信登录查询耗时: {query_duration:.3f}秒")
            
            return JsonResponse(user_list, safe=False)
        except Exception as e:
            print(f"微���登录查询错误: {str(e)}")
            return JsonResponse({
                'status': False,
                'message': '查询失败',
                'error': str(e)
            }, status=500)


class wx_CheckOpenIdExists(APIView):
    """检查OpenId是否存在"""
    
    def get(self, request, *args, **kwargs):
        try:
            openid = request.GET.get('openid')
            # 检查openid是否存在
            exists = models.User.objects.filter(open_id=openid).exists()
            return JsonResponse({
                'exists': exists
            })
        except Exception as e:
            return JsonResponse({
                'status': False,
                'message': '查询失败',
                'error': str(e)
            }, status=500)


class wx_UpdateUserOpenId(APIView):
    """绑定微信更新OpenId"""
    def post(self, request, *args, **kwargs):
        try:
            zh_name = request.data.get('zh_name')
            openid = request.data.get('openid')

            user = models.User.objects.filter(zh_name=zh_name).first()
            if not user:
                return JsonResponse({
                    'status': False,
                    'message': '用户不存在'
                })
            
            # 更新用户信息
            user.open_id = openid
            user.save()


            return JsonResponse({
                'status': True,
                'message': '更新成功'
            })
            
        except Exception as e:
            return JsonResponse({
                'status': False,
                'message': '更新失败',
                'error': str(e)
            }, status=500)





class wx_ChangePasswordById(APIView):
    """根据用户ID修改密码接口"""
    def post(self, request, *args, **kwargs):
        try:
            user_id = request.data.get('user_id')
            old_password = request.data.get('old_password')
            new_password = request.data.get('new_password')
            confirm_password = request.data.get('confirm_password')
            
            # 验证参数
            if not all([user_id, old_password, new_password, confirm_password]):
                return JsonResponse({
                    'status': False,
                    'message': '参数不完整'
                })
            
            # 验证新密码长度
            if len(new_password) < 6:
                return JsonResponse({
                    'status': False,
                    'message': '新密码长度不能少于6位'
                })
            
            # 验证两次输入的新密码是否一致
            if new_password != confirm_password:
                return JsonResponse({
                    'status': False,
                    'message': '两次输入的新密码不一致'
                })
            
            # 根据ID查找用户
            user = models.User.objects.filter(id=user_id).first()
            if not user:
                return JsonResponse({
                    'status': False,
                    'message': '用户不存在'
                })
            
            # 验证旧密码
            if user.zh_pwd != old_password:
                return JsonResponse({
                    'status': False,
                    'message': '原密码错误'
                })
            
            # 更新密码
            user.zh_pwd = new_password
            user.save()
            
            return JsonResponse({
                'status': True,
                'message': '密码修改成功'
            })
            
        except Exception as e:
            print(f"修改密码错误: {str(e)}")
            return JsonResponse({
                'status': False,
                'message': '修改密码失败，请稍后重试'
            })


class wx_CheckWechatBinding(APIView):
    """检查用户是否绑定微信"""
    
    def post(self, request, *args, **kwargs):
        try:
            zh_name = request.data.get('zh_name')
            if not zh_name:
                return JsonResponse({
                    'status': False,
                    'message': '用户名不能为空'
                })
            
            user = models.User.objects.filter(zh_name=zh_name).first()
            if not user:
                return JsonResponse({
                    'status': False,
                    'message': '用户不存在'
                })
            
            is_bound = bool(user.open_id)
            return JsonResponse({
                'status': True,
                'is_bound': is_bound,
                'avatar_url': user.wx_avatar_url if is_bound else None
            })
            
        except Exception as e:
            return JsonResponse({
                'status': False,
                'message': '查询失败',
                'error': str(e)
            }, status=500)


class wx_GetOpenId(APIView):
    """获取微信配置信息"""
    
    def post(self, request, *args, **kwargs):
        try:
            # 返回微信小程序配置信息
            return JsonResponse({
                'status': True,
                'appid': 'wxc89041aeb72ac2a1',  # 小程序AppID
                'secret': 'a7dbca410ccea20f72999540bc3d9dceeaaaaaaaaaaa21321312'[:32],  # 小程序AppSecret（截取前32位）
                'APP_URL': 'https://api.weixin.qq.com/sns/jscode2session?'
            })
            
        except Exception as e:
            return JsonResponse({
                'status': False,
                'message': '获取配置失败',
                'error': str(e)
            }, status=500)


# class wx_GetUserProfile(APIView):
#     """获取用户个人资料"""
#
#     def get(self, request, current_user, user_permissions, *args, **kwargs):
#         try:
#             # 获取用户详细信息
#             user_data = {
#                 'id': current_user.id,
#                 'zh_name': current_user.zh_name,
#                 'open_id': current_user.open_id,
#                 'wx_avatar_url': current_user.wx_avatar_url,
#                 'permission_level': current_user.Per_group.permit,
#                 'permission_name': current_user.Per_group.get_permit_display(),
#                 'department_id': current_user.part_id.part_id,
#                 'department_name': current_user.part_id.get_departm_display(),
#                 'work_team': current_user.per_team,
#                 'create_time': current_user.create_time.isoformat() if current_user.create_time else None
#             }
#
#
#             return JsonResponse({
#                 'status': True,
#                 'user_data': user_data
#             })
#
#         except Exception as e:
#             return JsonResponse({
#                 'status': False,
#                 'message': '获取用户资料失败',
#                 'error': str(e)
#             }, status=500)
from django.conf import settings
import os
class wx_UpdateUseravatar(APIView):
    """更新用户头像"""
    def post(self, request,*args, **kwargs):
        # 2. 检查是否有文件上传
        if 'avatarImg' not in request.FILES:
            return JsonResponse({
                'success': False,
                'message': '未接收到图片文件'
            }, status=400)

        # 3. 获取上传的文件对象
        avatar_file = request.FILES['avatarImg']
        # 用户ID
        user_id = request.data.get('user_id')
        user_name = request.data.get('user_name')
        user_openid = request.data.get('user_openid')
        print(user_openid)
        # 4. 配置文件保存的详细路径（避免重名：按日期分文件夹 + 时间戳 + 原文件名）
        # 4.1 获取当前日期（如 20250908），用于创建子文件夹
        today = datetime.now().strftime('%Y%m%d')
        # 4.2 拼接最终保存路径（MEDIA_ROOT + 日期子文件夹）
        save_dir = os.path.join(settings.MEDIA_ROOT, today)
        # 4.3 若文件夹不存在，自动创建
        if not os.path.exists(save_dir):
            os.makedirs(save_dir, exist_ok=True)  # exist_ok=True 避免文件夹已存在时报错

        # 最终保存的文件名（如 1-avatar.jpg）
        save_filename = f"{user_id}-{user_openid}.jpg"

        # 6. 保存文件到本机文件夹
        try:
            # 拼接完整的文件路径（save_dir + save_filename）
            save_path = os.path.join(save_dir, save_filename)
            # 写入文件（二进制模式）
            with open(save_path, 'wb') as f:
                # 分块读取上传的文件（避免大文件内存溢出）
                for chunk in avatar_file.chunks():
                    f.write(chunk)
            # 保存文件信息到数据库
            user = models.User.objects.get(id=user_id)
            user.wx_avatar_url = f"/media/{today}/{save_filename}"
            user.save()
            # 7. 保存成功：返回结果（包含文件在本机的路径，方便调试）
            return JsonResponse({
                'success': True,
                'message': '图片上传成功',
                'data': {
                    'local_path': save_path,  # 本机物理路径（如 D:/django_avatar/20250908/135547123456-avatar.jpg）
                    'file_name': save_filename  # 保存的文件名
                }
            })

        except Exception as e:
            # 8. 保存失败：返回错误信息
            return JsonResponse({
                'success': False,
                'message': f'图片保存失败：{str(e)}'
            }, status=500)